/**
 * Created by PanJiaChen on 16/11/18.
 */

export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result;

  const later = function() {
    // 据上一次触发时间间隔
    const last = +new Date() - timestamp;

    // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last);
    } else {
      timeout = null;
      // 如果设定为immediate===true，因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      }
    }
  };

  return function(...args) {
    context = this;
    timestamp = +new Date();
    const callNow = immediate && !timeout;
    // 如果延时不存在，重新设定延时
    if (!timeout) timeout = setTimeout(later, wait);
    if (callNow) {
      result = func.apply(context, args);
      context = args = null;
    }

    return result;
  };
}

/**
 * Parse the time to string
 * @param {(Object|string|number)} time
 * @param {string} cFormat
 * @returns {string | null}
 */
export function parseTime(time, cFormat) {
  if (arguments.length === 0) {
    return null;
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}';
  let date;
  if (typeof time === 'object') {
    date = time;
  } else {
    if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
      time = parseInt(time);
    }
    if ((typeof time === 'number') && (time.toString().length === 10)) {
      time = time * 1000;
    }
    date = new Date(time);
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  };
  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
    const value = formatObj[key];
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ]; }
    return value.toString().padStart(2, '0');
  });
  return time_str;
}

/**
 * @param {number} time
 * @param {string} option
 * @returns {string}
 */
export function formatTime(time, option) {
  if (('' + time).length === 10) {
    time = parseInt(time) * 1000;
  } else {
    time = +time;
  }
  const d = new Date(time);
  const now = Date.now();

  const diff = (now - d) / 1000;

  if (diff < 30) {
    return '刚刚';
  } else if (diff < 3600) {
    // less 1 hour
    return Math.ceil(diff / 60) + '分钟前';
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + '小时前';
  } else if (diff < 3600 * 24 * 2) {
    return '1天前';
  }
  if (option) {
    return parseTime(time, option);
  } else {
    return (
      d.getMonth() +
      1 +
      '月' +
      d.getDate() +
      '日' +
      d.getHours() +
      '时' +
      d.getMinutes() +
      '分'
    );
  }
}

/**
 * @param {string} url
 * @returns {Object}
 */
export function param2Obj(url) {
  const search = url.split('?')[1];
  if (!search) {
    return {};
  }
  return JSON.parse(
    '{"' +
      decodeURIComponent(search)
        .replace(/"/g, '\\"')
        .replace(/&/g, '","')
        .replace(/=/g, '":"')
        .replace(/\+/g, ' ') +
      '"}'
  );
}
const qs = require('querystring');
export const getQueryStringFromJson = function(json) {
  return qs.stringify(json);
};

// 时间格式化-yyyy-MM-dd 00or24
export const getFormatYMDDateStr = function(date, isEnd = false) {
  if (!date) {
    return '';
  }
  var time = new Date(date);
  return `${time.getFullYear()}-${(time.getMonth() + 1)}-${time.getDate()} ${isEnd ? '23:59:59' : '00:00:00'}`;
};

// 格式化str时间为yyyy-MM-dd的字符串
export const formatStrDataToYMDStr = function(date) {
  if (!date) {
    return '';
  }
  date = date.replace(/-/g, '/');
  const time = new Date(date);
  return `${time.getFullYear()}-${(time.getMonth() + 1)}-${time.getDate()}`;
};

// 判断是否是ie浏览器
export const isIE = () => {
  if (window.navigator.userAgent.indexOf('MSIE') >= 1 || (!!window.ActiveXObject || 'ActiveXObject' in window)) {
    return true;
  }
  return false;
};

// 创建全局遮罩层
export const createMask = function(data) {
  const mask = document.createElement('div');
  mask.style.cssText = 'position: fixed;left: 0;top: 0;right: 0;bottom: 0;z-index: 1110;background:#fff;opacity:0;';
  document.body.appendChild(mask);
  return mask;
};

// 判断是否是safari
export const isSafari = () => {
  if (/Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)) {
    return true;
  }
  return false;
};
// 判断是否是FF
export const isFireFox = () => {
  if (/Firefox/.test(navigator.userAgent)) {
    return true;
  }
  return false;
};

// 判断是否是Chrome
export const isChrome = () => {
  if (/Chrome/.test(navigator.userAgent)) {
    return true;
  }
  return false;
};

